// 应为源文件中使用了C++标准库, 因此文件名为.cpp, 且用clang++进行编译,


// 错误的方式
/*
// 1. 编译生成 obj文件
clang++ -c JniDemo.o JniDemo.cpp \
-I$JAVA_HOME/include \
-I$JAVA_HOME/include/darwin

// 2. 链接成so文件 (这应该是linux生成动态库的方式)
clang++ JniDemo.o -shared -fPIC -o libJniDemo.so
*/


// mac下生成动态库的, 正确的方式:
/*
生成动态库文件 (clang++):
clang++ -dynamiclib \
-I$JAVA_HOME/include \
-I$JAVA_HOME/include/darwin \
-o libJniDemo.jnilib \
JniDemo.cpp

生成动态库文件 (g++也是clang++):
g++ -dynamiclib \
-I$JAVA_HOME/include \
-I$JAVA_HOME/include/darwin \
-o libJniDemo.jnilib \
JniDemo.cpp

生成动态库文件 (gnu-g++ 是GNU的g++的别名):
gnu-g++ -dynamiclib \
-I$JAVA_HOME/include \
-I$JAVA_HOME/include/darwin \
-o libJniDemo.jnilib \
JniDemo.cpp
 */

// -c 汇编, 生成obj文件
// -I 指定头文件路径, 第一个 -I 指定jni.h头文件的搜索路径
//    因为jni.h中导入了jni_md.h文件,这个头文件定义了jint和jlong类型,
//    这两个类型是与机器相关的, 
//    mac下路径为$JAVA_HOME/include/darwin,
//    windows下路径为$JAVA_HOME/include/win32,
//    linux ...
//
//    如没有用-o指定输出文件名,则默认的输出文件与源文件同名,这里是JniDemo.o
//
//
//    jni.h源码: https://hg.openjdk.java.net/jdk/jdk11/file/1ddf9a99e4ad/src/java.base/share/native/include
//    jni_md.h源码: https://hg.openjdk.java.net/jdk/jdk11/file/1ddf9a99e4ad/src/java.base/os/native/include
//    其中os为: macosx,windows,unix,linux,solaris,aix
//
//    https://hg.openjdk.java.net/jdk/jdk11/file/1ddf9a99e4ad/src/hotspot/share/include


#include "JniDemo.h"

#include <cstdio>	// c标准输入输出
#include <string>	// c++标准库的string类

/*
 * Class:     com_stone_demo_JniDemo
 * Method:    hello
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_com_stone_demo_JniDemo_hello
  (JNIEnv *, jobject) {
	printf("Hello world !");
}

/*
 * Class:     com_stone_demo_JniDemo
 * Method:    greeting
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_stone_demo_JniDemo_greeting
  (JNIEnv *env, jobject) { // 如果参数没有使用到, 则可以不写参数名
	std::string hello = "Hello from C++";
    return env->NewStringUTF(hello.c_str());	
}
